{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1 分析用户表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 修改列名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns = ['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析location"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57339"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 平均每个地区，存在的用户个数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.sum() / location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 把location变成国家"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(location_value_counts)),\n",
    "    location_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析 年龄"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  NaN\n",
       "2        3          russia  NaN\n",
       "4        5  united kingdom  NaN\n",
       "6        7             usa  NaN\n",
       "7        8          canada  NaN"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id     110762\n",
       "location    110762\n",
       "age              0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 278858 entries, 0 to 278857\n",
      "Data columns (total 3 columns):\n",
      "user_id     278858 non-null int64\n",
      "location    278858 non-null object\n",
      "age         168096 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 6.4+ MB\n"
     ]
    }
   ],
   "source": [
    "df_user.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id   location   age\n",
       "1         2        usa  18.0\n",
       "3         4   portugal  17.0\n",
       "5         6        usa  61.0\n",
       "9        10      spain  26.0\n",
       "10       11  australia  14.0"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "df_user_age_notnull.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "age_value_counts_sort_by_age = df_user_age_notnull['age'].value_counts().sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD4CAYAAAAEhuazAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXSb133m8e8PAAmu4iJSG0WJsi0rtpTIdhjbiZ3Vu5NUbto0zplplNYZt6funCzTSZ1pT531NGmn8dRtko4Te6I0aZy9Vp3UjuIljpPYlrzJlmRJtCRLtGSRFCmKIEWAAO78gRcyJQEkKAJ4QeD5nMMD4OLFi3sF6sHlfe97X3POISIilSXgdwVERKT4FP4iIhVI4S8iUoEU/iIiFUjhLyJSgUJ+V2AqbW1trqury+9qiIjMKU899dSAc659qm1KOvy7urrYsmWL39UQEZlTzOzl6bbRsI+ISAVS+IuIVCCFv4hIBVL4i4hUIIW/iEgFUviLiFQghb+ISAVS+OdRNJ7g357YTzSe8LsqIiJTUvjn0cMv9vO/fvI8G36zz++qiIhMSeGfRy/1RwD42iMvEYnGfa6NiEh2Cv88eqkvQk1VgKGxCb75671+V0dEJCuFfx691B+he3krV563gDsf3cPw8Qm/qyQikpHCP0+cc+zpH+Ws9no+duW5HBuPc9dj6v2LSGlS+OdJ/0iUkWics9sbWNPRxOXntPHAC6/6XS0RkYwU/nnS4x3sPbu9AYA3dbWyq2+EY+Ma+hGR0qPwz5M9/aMAnL2gHoALlzXjHGw9MOxntUREMlL458krR49TFTQWzasBYG1nMwDP7B/ys1oiIhkp/PNkNBqnIRzCzABoqq3inAUNPHPgqM81ExE5ncI/TyLROHXVJ18V88LOZjbvG+Tg0eM+1UpEJDOFf56MRRPUh4MnlX34si5w8MGvP86RSNSfiomIZKDwz5PRWJz68Mk9/9VLmthw08UcOjrO32zc5lPNREROp/DPk9FonPpThn0ALlrWwkevXMlPtx7i4Rf7fKiZiMjpFP55MhZLUFcdzPjczW87CzN08FdESobCP08i3myfTKqCAZpqqxgeixW5ViIimSn882QslqAunLnnD6mpn0e10JuIlAiFf55kG/NPa66t4uiYwl9ESoPCPw/iiSTRePK02T6TNdVVq+cvIiVD4Z8Ho7HUNXuzHfCFVM9fY/4iUioU/nkw6l2yMdsBX4DmOo35i0jpyCn8zWyfmT1vZs+a2RavrNXMNpnZbu+2xSs3M7vDzHrMbKuZXTRpP+u97Xeb2frCNKn4xmKp8K+batintopjxydIJl2xqiUiktVMev7vdM5d4Jzr9h7fCjzonFsJPOg9BrgOWOn93Ax8DVJfFsBtwCXAxcBt6S+MuW40mhr2qZ9i2KeptoqkgxFd2F1ESsBshn3WARu8+xuAGyaVf8ulPA40m9li4Bpgk3Nu0Dk3BGwCrp3F+5eM9LDPVAd8m+uqARjWjB8RKQG5hr8Dfm5mT5nZzV7ZQufcIQDvdoFX3gEcmPTaXq8sW/lJzOxmM9tiZlv6+/tzb4mP0gd8p5vqCXD0uA76ioj/sqfVyS5zzh00swXAJjN7cYptLUOZm6L85ALn7gTuBOju7p4TA+SvjflPMdunzgt/9fxFpATk1PN3zh30bvuAn5Aasz/sDefg3aZXLesFOie9fClwcIryOS+Sw2yfphM9f4W/iPhv2vA3s3oza0zfB64GXgA2AukZO+uBe737G4EPebN+LgWGvWGhB4CrzazFO9B7tVc2541Fp5/n3+T1/DXXX0RKQS7DPguBn3iXJwwB/+acu9/MNgPfN7ObgP3A+73tfwZcD/QAY8AfATjnBs3sc8Bmb7vPOucG89YSH6V7/qdeyWuydM9/WD1/ESkB04a/c24PsDZD+RHgigzlDrgly77uBu6eeTVL21gsTm1VkGAg02GNlHAoSF11UGP+IlISdIZvHozGTr+EYybNWtlTREqEwj8PRqOnX8Ixk6a6agZHYzzfO0z353/B7sMjRaidiMjpFP55MBpNTDnen7ZmyTw27xvke1v2MxCJ8o1f7S1C7URETqfwz4OxWHzKpR3Srlm9iJHxOPc8mTrX7SfPvsKRSLTQ1RMROY3CPw8GIlFa6qun3e7ylW3UVQeJJx0fuXwFsXiSL/7ni6SOkYuIFI/Cf5accxwYPM6y1rppt62pCvLOVQswgz95+9n893edww+e6uXbT+wvQk1FRF6j8J+lgUiM4xMJOltqc9r+k9eu4p8/eBHtjWE+fuW5vG5RIz/beqjAtRQROVmua/tIFgeGxgDozKHnD7B8fj3L59cDEAgYna11HBgcK1j9REQyUc9/ltLBnWv4n6q1rpohLfkgIkWm8J+lE+Hfcmbh31xfxdDohA76ikhRKfxn6cDgcdoawtTmMNUzk9a6amKJJGPeNQFERIpB4T9L+wfH6GzN7WBvJukpooOjGvoRkeJR+M/SgaGxnKZ5ZtPqXd5R4/4iUkwK/1mIJ5IcGh5naY7TPDNRz19E/KDwn4XB0RiJpGNR05mHf2u9ev4iUnwK/1noG0mty9PeED7jfaSHfQZHtdSziBSPwn8W+r1F2dobzzz8G2tCBAPGkIZ9RKSIFP6z0O/1/BfMIvwDAaOlropBDfuISBEp/GchHf5tsxj2AWiuq1bPX0SKSuE/C/0jURrDoTM+wStNSzyISLEp/GehPxKd1Xh/Wou3xIOISLEo/GehfyRKWx7Cv7W+WmP+IlJUCv9ZGBjJT8+/rSHMkUiUeCKZh1qJiExP4T8L/SPRWc3xT1vSXEvSvXbegIhIoSn8z9DxWIKRaDwvPf8lzakzhA8ePT7rfYmI5ELhf4YG8nCCV1pHcw0Aryj8RaRIcg5/Mwua2TNmdp/3eIWZPWFmu83se2ZW7ZWHvcc93vNdk/bxKa98p5ldk+/GFFPfyDiQn/Bf3JTu+Y/Pel8iIrmYSc//o8COSY+/BNzunFsJDAE3eeU3AUPOuXOA273tMLPzgRuB1cC1wFfNbHYT5H30654jmMH5i+fNel/14RDNdVUa9hGRoskp/M1sKfBu4BveYwPeBfzQ22QDcIN3f533GO/5K7zt1wH3OOeizrm9QA9wcT4a4Yf7th7kTctbWTivJi/7W9JUq/AXkaLJtef/f4BPAum5iPOBo865uPe4F+jw7ncABwC854e97U+UZ3jNCWZ2s5ltMbMt/f39M2hK8ew6PMKuwxHes3Zx3va5pLlWY/4iUjTThr+ZvQfoc849Nbk4w6Zumuemes1rBc7d6Zzrds51t7e3T1c9X2zafhgzuHbNorzts6O5Rj1/ESmaUA7bXAb8jpldD9QA80j9JdBsZiGvd78UOOht3wt0Ar1mFgKagMFJ5WmTXzOn7Do8wpKmWhY05mfIB1I9/2PjcUbGJ2isqcrbfkVEMpm25++c+5RzbqlzrovUAduHnHP/BXgY+H1vs/XAvd79jd5jvOcfcs45r/xGbzbQCmAl8GTeWlJE+wZGWdFWn9d9puf6HxrWjB8RKbzZzPP/S+ATZtZDakz/Lq/8LmC+V/4J4FYA59w24PvAduB+4BbnXGIW7+8L5xx7Bkbpajvzi7Znkg5/jfuLSDHkMuxzgnPuEeAR7/4eMszWcc6NA+/P8vovAF+YaSVLyeBojJHxOCvaGvK63w6d5SsiRaQzfGdo35FRAFbkueff3hgmFDCFv4gUhcJ/hvYOjAHQNT+/Y/7BgLGoqUZn+YpIUSj8Z2jfwCjBgNHZmt+eP2iuv4gUj8J/hvYeGaWzpZaqYP7/6TqadZaviBSHwn+GDh09TkdLbUH2vaS5hleHx0kkTzv3TUQkrxT+MxSJxmkMF+YkrCXNtcSTjn5d1EVECkzhP0OR8TgNNTOaIZszzfUXkWJR+M/QSDROQ7gw4a+5/iJSLAr/GXDOpYZ9CtTzT4f/y965BCIihaLwn4GxWALnKFjPvz4c4qy2erb2Dhdk/yIiaQr/GYhEU5cvKNSYP8DrlzYp/EWk4BT+MzAy7oV/gXr+AG9Y2syrx8bpO6YzfUWkcBT+MzDq9fwLNeYPsHZpE4B6/yJSUAr/GTgx7FOgef4Aq5c0ETDY2nu0YO8hIqLwn4FiDPvUVgc5d2Ejz6nnLyIFpPCfgUgRhn0A3rC0ia29R0ldAE1EJP8U/jMQGZ8ACtvzh9RB36GxCXqHdLKXiBSGwn8G0j3/+gKH/9qlzQA8p3F/ESkQhf8MjETjhEMBqkOF/WdbtaiR6mCA5zXuLyIFovCfgch44db1maw6FOC8xY3q+YtIwSj8ZyASLdyKnqe6oLOZ5w4MMxaLF+X9RKSyKPxnoFg9f4D3rF3C8YkEP916qCjvJyKVReE/A4VczvlU3ctbOKu9nu9tPlCU9xORyqLwn4HIeOGWcz6VmfGB7k62vDzE/iNjRXlPEakcCv8ZiBSx5w/wlrPbANh2ULN+RCS/pg1/M6sxsyfN7Dkz22Zmn/HKV5jZE2a228y+Z2bVXnnYe9zjPd81aV+f8sp3mtk1hWpUoRTzgC/A2QvqAejpixTtPUWkMuTS848C73LOrQUuAK41s0uBLwG3O+dWAkPATd72NwFDzrlzgNu97TCz84EbgdXAtcBXzSyYz8YUWqrnX7hF3U5VVx2io7mWnn6Fv4jk17Th71LS6VPl/TjgXcAPvfINwA3e/XXeY7znrzAz88rvcc5FnXN7gR7g4ry0ogjGJxLE4smijfmnnbOgQT1/Ecm7nMb8zSxoZs8CfcAm4CXgqHMuPQm9F+jw7ncABwC854eB+ZPLM7ym5A2NxQBora8u6vues6CBl/ojJJNa5E1E8ien8HfOJZxzFwBLSfXWz8u0mXdrWZ7LVn4SM7vZzLaY2Zb+/v5cqlcUg6Op8G+pK96wD6TCf3wiyStHtcibiOTPjGb7OOeOAo8AlwLNZpYeA1kKHPTu9wKdAN7zTcDg5PIMr5n8Hnc657qdc93t7e0zqV5BHR1LrejZXFf8nj/ooK+I5Fcus33azazZu18LXAnsAB4Gft/bbD1wr3d/o/cY7/mHXGph+o3Ajd5soBXASuDJfDWk0Pwa9lnphf+Lr44U9X1FpLzlcvRyMbDBm5kTAL7vnLvPzLYD95jZ54FngLu87e8C/tXMekj1+G8EcM5tM7PvA9uBOHCLcy6R3+YUzpA37NNc5GGf5rpquubX8cz+oaK+r4iUt2nD3zm3FbgwQ/keMszWcc6NA+/Psq8vAF+YeTX9N+QN+7QUedgH4KJlLTy6ewDnHKmJUyIis6MzfHM0NBajMRyiKlj8f7ILl7cwEInyw6d6+crDPUV/fxEpP8WdtD6HDY3GaK4v7pBP2kXLUlf2+p8/3Oo9buHNZ8/3pS4iUh7U88/R0NgErT4M+QCsWthIXXWQYMBoqavi9l/s0sXdRWRW1PPP0dBYzJfxfoBQMMBHLl/BvNoqzIzP3bed3X0Rzl3Y6Et9RGTuU/jnaGgsxllt9b69/yeuXgXAjkPHANj56ojCX0TOmIZ9cnR0dIKWIs/xz2RFWz1mOulLRGZH4Z+DWDzJSDTu27DPZDVVQTpb6nhJK32KyCwo/HNw9Lg/6/pko5U+RWS2FP45SK/rUwrDPgBnt9ezd2CUhFb6FJEzpPDPwcBIFMC3qZ6nOru9gWg8yStDWulTRM6Mwj8HO7xF1c5Z2OBzTVLSK33+7X/u4Bu/2nNiuWkRkVwp/HOw7eAw7Y1hFjTW+F0VAFYubKSmKsCm7Yf5/E938IH/+1u/qyQic4zm+edg+8FjrFkyz+9qnNBUW8Vvb72CunCQb/xqL3//wE4GIlFePjLGmo55hENz6tLIIuID9fynMT6RYHdfhNVLmvyuykla6qsJh4K8YWmqXg+/2Mfvfe033PXYXp9rJiJzgcJ/GjtfHSGRdKwuoZ7/ZKu8s3y/88R+AH6x/bCf1RGROULhP41tB1PLKZRazz+tvTFMc10Vzx44CsAzB45yJBL1uVYiUuoU/tN4eXCU6mCAztZav6uSkZmdWONn4bwwzsEjO0vnwvciUpoU/tMYjMRoa6gu6StopYd+PtDdyYLGMA/t7PO5RiJS6jTbZxpHRmO0NpTGyV3ZnLsoFf7dXa0cHB7nFzsOk0g6goHS/cISEX8p/KdxJBJlfn3Y72pM6d2vX8zh4XEuPWs+Q2MxfvhULy+8Mszazma/qyYiJUrDPtMYiMSYX+I9/9b6av7imlVUhwJcdk4bAI/1DPhcKxEpZQr/KTjnODIapa2htHv+k7U1hFm9ZB6P7tJBXxHJTuE/hbFYgvGJJPNLZDXPXL11ZTtP7x8iEo37XRURKVEK/ymkF0xrnWPh/7aVbUwkHE/sOQLA8PEJxicSPtdKREqJwn8KA97JUnNp2AfgjV0t1FQF+NXuAcYnElz/j7/iM/+xze9qiUgJ0WyfKRyJpHr+pX7A91ThUJBLz5rPo7v76Wiu5ZWjx9nunaksIgI59PzNrNPMHjazHWa2zcw+6pW3mtkmM9vt3bZ45WZmd5hZj5ltNbOLJu1rvbf9bjNbX7hm5ceR0VTPf/4c6/lDatx/T/8oX7r/RQD2HRnzuUYiUkpy6fnHgf/hnHvazBqBp8xsE/Bh4EHn3BfN7FbgVuAvgeuAld7PJcDXgEvMrBW4DegGnLefjc65oXw3Kl8G0j3/OTbmD/D+7qUcOz5B79BxqkMBvvvkfoZGYyVzKUoR8de0PX/n3CHn3NPe/RFgB9ABrAM2eJttAG7w7q8DvuVSHgeazWwxcA2wyTk36AX+JuDavLYmz45EYjSEQ9RUzb318efVVPHxq87lH/5gLVe8bgEA+46M+lwrESkVMzrga2ZdwIXAE8BC59whSH1BAAu8zTqAA5Ne1uuVZSs/9T1uNrMtZralv9/fueqDo9E5N9Mnk662OgBe1tCPiHhyDn8zawB+BHzMOTfV0cNMC8q4KcpPLnDuTudct3Ouu729PdfqFcSR0VhZhP/SljrM1PMXkdfkFP5mVkUq+L/jnPuxV3zYG87Bu00vJdkLdE56+VLg4BTlJWs0GqchPPcnRNVUBVnSVKuev4ickMtsHwPuAnY457486amNQHrGznrg3knlH/Jm/VwKDHvDQg8AV5tZizcz6GqvrGRF40lqqsrjVIjl8+tO9PyTydP+4BKRCpNLsl0G/CHwLjN71vu5HvgicJWZ7Qau8h4D/AzYA/QAXwf+DMA5Nwh8Dtjs/XzWKytZ4xOJsrkYeldbPXv6RxkcjbH2sz/nYa35L1LRph3TcM49RubxeoArMmzvgFuy7Otu4O6ZVNBP0XiScJn0/M9b1Mi/PbGfB7a9ysh4nJ7DEd65asH0LxSRslQeyVYg4xPJsun5n+9dgP4HW1ITroaPT/hZHRHxmcJ/CtF4omzG/FctSoX/0/tTF3o/Nq7wF6lk5ZFsBRIto55/QzhE1/y6E4+PqecvUtEU/lkkk45Yonxm+wCct3jeifsa9hGpbOWTbHkWjScB5uTSDtmc74V/VdA4Nq4LvYhUsrl/BlOBROOpi5+EQ+Xz/XjV6oU81jNAdSjAoeFxv6sjIj4qn2TLs/GJ8uv5v27RPL73J29mSVOtxvxFKpzCP4ty7PmnNdVVabaPSIUrv2TLk3Ls+afNqwkxPpE88QUnIpVH4Z9FWff8a6sAOHZcB31FKlX5JVuelHXPPx3+GvoRqVgK/yzKueefDn/N9RepXOWXbHlS1j3/mvSwj8JfpFIp/LMo555/k3r+IhWv/JItT8q651+bOrdPZ/mKVC6Ffxbl3PPXsI+IlF+y5Um65x8uw55/TVWQcCig8BepYAr/LMq55w+pcX+N+YtUrvJMtjw40fMv0/BfPr+O518Z9rsaIuKT8ky2PIjGE4RDAcyyXb54brvyvIVsO3iM3qExv6siIj5Q+GcRnUiW5UyftGtWLwLg59sO+1wTEfGDwj+L8YlE2Q75AHS11bNqYSP3b3vV76qIiA/KN91mKRov754/wHvXLubJvYP09I34XRURKTKFfxbl3vMH+ODFywiHAnzjV3v9roqIFFl5p9ssVELPf35DmN9741J+/PQrDESifldHRIpI4Z9FJfT8Af7oLV3EEkl+9FSv31URkSKaNt3M7G4z6zOzFyaVtZrZJjPb7d22eOVmZneYWY+ZbTWziya9Zr23/W4zW1+Y5uRPJfT8AVYubORNXS1898n9OOf8ro6IFEkuXdtvAteeUnYr8KBzbiXwoPcY4DpgpfdzM/A1SH1ZALcBlwAXA7elvzBK1fhEgpqq8u/5Q2rsf9+RMR7fM+h3VUSkSKZNN+fco8CpqbAO2ODd3wDcMKn8Wy7lcaDZzBYD1wCbnHODzrkhYBOnf6GUlGg8SThU/j1/gOvWLKYqaDy6u9/vqohIkZxp13ahc+4QgHe7wCvvAA5M2q7XK8tWfhozu9nMtpjZlv5+/8JofCJBuEJ6/rXVQdZ0NLFln3r+IpUi3+mWaS0EN0X56YXO3emc63bOdbe3t+e1cjNRST1/gDd1tfLcgWHGJxJ+V0VEiuBMw/+wN5yDd9vnlfcCnZO2WwocnKK8ZFXSmD9A9/IWYokkL2ixN5GKcKbpthFIz9hZD9w7qfxD3qyfS4Fhb1joAeBqM2vxDvRe7ZWVrErr+b9xeer4++Z9Qz7XRESKIZepnt8FfgusMrNeM7sJ+CJwlZntBq7yHgP8DNgD9ABfB/4MwDk3CHwO2Oz9fNYrK0mJpCMWT1JbAVM90+Y3hFm1sJFN27XWj0glCE23gXPug1meuiLDtg64Jct+7gbunlHtfBKJpq5tWx+unPAHeH/3Uj7/0x3sfHWEVYsa/a6OiBRQ5Qxqz8CoF/4N4Wm/G8vK+y5aSnUwwHef3O93VUSkwBT+GZwI/5rKCv/W+mquWbOIf3/2FSYSSb+rIyIFpPDPYOTEsE9lhT/Au1+/mKNjEzy5t2QPyYhIHij8M6jUYR+At5/bTm1VkPtf0IFfkXKm8M8gHf711ZUX/rXVQd6xqp0Htr1KMqmF3kTKlcI/g5HxVPg3VtiYf9p1r19M30iU37x0xO+qiEiBKPwzGK3gMX+Aq89fSEtdFd9+/GW/qyIiBaLwz2A0llrfptLm+afVVAX5gzd1smnHYQ4NH/e7OiJSAAr/DCLROFVBq6jlHU71Xy9ZjgG33btNF3kRKUMK/wwi4/GKHfJJ62yt49brXsfPtx/m20/opC+RcqPwz2A0Gq/IaZ6nuunyFVyyopV/fmg3sbhO+hIpJwr/DCIKfwDMjD99x9kcPhblvq0lvQK3iMyQwj+DSFTDPmnvOLedlQsa+OeHehg+PuF3dUQkT8oy/McnEjyys4+R8TMLq1GF/wlmxmd+ZzUHhsb4yIbNGv4RKRNlGf5be4f58P/bzGO7B87o9ZFonEaF/wlvOaeN//3+tWzeN8S//PIlv6sjInlQluF/4bJmGsMhfrnrzC4APxpNVOwc/2zWXdDBe9cu4Z8e2s3uwyN+V0dEZqksw78qGOCyc9p4dFf/Gc1R15h/Zre993wawiE++aOtJLTuj8icVpbhD/D2Ve0cHB6npy8yo9c55xiNabZPJm0NYf7mvefzzP6j/OMvdunkL5E5rGzD/23ntgPMeOhnLJbAucpczjkXN1zQwe9e2MEdD/Xw1//+gt/VEZEzVLbh39Fcy9KWWp7Zf3RGr4tU+KJu0zEzvvwHa/njy1bwnSf281ut/CkyJ5Vt+AO8vqOJFw4Oz+g1kQq+kEuuzIxPXruKjuZaPnvfds3/F5mDyjr813Q08fKRsRmFU6Uv55yrmqogt733fHa+eoyrvvzLkvwLYCASZdP2w35XQ6QklXX4r14yD4BtM+j9p69d29FcW5A6lZOrVy/i3lsup7EmxB/e9QT/8VxpLQHxlYd7+G/f2sLgaMzvqoiUnLIO/zUdTQBse+VYTtuPxeL8yy9f4vJz2jjf++KQqb1+aRM/ueUyLuhs5i9/tJV9A6N+V+mEX/ekTvLbfjC3z1+kkpR1+Lc1hFncVJPTuL9zjr+7fycDkRgfv2plEWpXPubVVHHHBy8kFDBu+Oqv+ciGzbw6PO5rnfqOjbPrcGqa7/ZDMzvuI1IJyjr8Abq7WnloRx99I9nDaCwW57aN2/jmb/bx4bd08cblrUWsYXlY0lzL3R9+E+963QIe3zPI+776a775673s6Y/4cj5A+vrDoYCp5y+SQdGPaprZtcA/AkHgG865Lxby/T5+5Uruf+EQn79vB7d/4AKCATvx3Ev9Ef7+/p08vvcIR8cm+OPLVvDX7z6vkNUpa91drXR3tbLt4DAfu+dZPv0f2wE4q72e97xhCUuaarhuzWKa6qoKXpdHdvbRXFfFhZ3NbD+k8Bc5VVHD38yCwFeAq4BeYLOZbXTObS/Ue57V3sCfvv1s/umhHp56eYiz2us5Z0EDzsEPthygKhTgitct5IMXd9LdpR5/Pqxe0sSmT7yd/UfG+OWuPjY+d5A7HtwNwN89sJO3rmyjrjrIvJoqls2v4+KuVjpb6wgGjKAZgYDhnGPvwCiDozECAWN4bILVHfNY0FiT9X2TSUcskeSFV4a597mDrH9zF/NqQjy6e4DxiQQ1VflbrymRdIzF4oQCAWqrtQ6UzD1WzD/JzezNwKedc9d4jz8F4Jz720zbd3d3uy1btsz6fZNJx8+3v8oPtvTSH4myy1uY7K0r2/nsutUsbtLMnkI7Hkuw6/AIt/9iF3sHRhmLJRg+PpFxiWgzCJhlXD+ovTFMQzhELJ4klkiSSDriidT98YnUvgKWGoa6/2Nv47Hd/fzpt59mXk2IhnCIUDBANJ6gKhigOpQa9XQOks4RTziGxmIn/jqMxZPUVAWpqQpQWxUk6VJDhJFo/MR7AVSHAoS9/YVDqdtQML3v19pwUmvc6WXpbU8um/wSd6JsNBpnLJZ47T2Dr72vIeXgHava+at3n39GrzWzp5xz3VNtU+xhnw7gwKTHvcAlkzcws5uBmwGWLVuWlzcNBIxr1yzm2jWLAYgnkjhSC8BJcdRWB1nb2cw3/+jiE2XJpKN36Di/3TPA4OgEiWSSRBISySTxpGNZax2Lm2tJJPKYe+EAAASxSURBVJPUV4d4ev9R9g5ETgq9UCBAMGBUh1IBXRU0BkcneN9FHTSEQ7x1ZTvr37zcC+4EiWSScCjIRCJJNJH+sjCCBsFAgOa6qhNfOtWhANGJBOMTScYmEgQN6sKpL5G66iD11SEmkskTX2LReDL1pRRPEk8msXQMT0rjycFsZhnKTt/WJhWm79V7dYglTn9fKQ8L52X/Kzcfih3+mTolJ3eInLsTuBNSPf9CVCKk0C8JgYCxbH4dy+bn9iV/yVnzZ/we9eEQn1m3ZsavEyl3xU7BXqBz0uOlQGmdGSQiUgGKHf6bgZVmtsLMqoEbgY1FroOISMUr6rCPcy5uZn8OPEBqqufdzrltxayDiIj4MM/fOfcz4GfFfl8REXmNjnyKiFQghb+ISAVS+IuIVCCFv4hIBSrq8g4zZWb9wMuz2EUbMJCn6swlanflqdS2q92ZLXfOtU+1g5IO/9kysy3TrW9RjtTuylOpbVe7z5yGfUREKpDCX0SkApV7+N/pdwV8onZXnkptu9p9hsp6zF9ERDIr956/iIhkoPAXEalAZRn+Znatme00sx4zu9Xv+hSSme0zs+fN7Fkz2+KVtZrZJjPb7d22+F3PfDCzu82sz8xemFSWsa2Wcof3O7DVzC7yr+azk6XdnzazV7zP/Vkzu37Sc5/y2r3TzK7xp9azZ2adZvawme0ws21m9lGvvBI+82xtz9/n7pwrqx9SS0W/BJwFVAPPAef7Xa8Ctncf0HZK2d8Bt3r3bwW+5Hc989TWtwEXAS9M11bgeuA/SV097lLgCb/rn+d2fxr4iwzbnu/9zoeBFd7/haDfbTjDdi8GLvLuNwK7vPZVwmeere15+9zLsed/MdDjnNvjnIsB9wDrfK5Tsa0DNnj3NwA3+FiXvHHOPQoMnlKcra3rgG+5lMeBZjNbXJya5leWdmezDrjHORd1zu0Fekj9n5hznHOHnHNPe/dHgB2krgNeCZ95trZnM+PPvRzDP9NF4qf6R5vrHPBzM3vKzG72yhY65w5B6pcIWOBb7QovW1sr4ffgz73hjbsnDe2VZbvNrAu4EHiCCvvMT2k75OlzL8fwn/Yi8WXmMufcRcB1wC1m9ja/K1Qiyv334GvA2cAFwCHgH7zysmu3mTUAPwI+5pw7NtWmGcrKre15+9zLMfwr6iLxzrmD3m0f8BNSf+odTv+56932+VfDgsvW1rL+PXDOHXbOJZxzSeDrvPYnflm128yqSIXfd5xzP/aKK+Izz9T2fH7u5Rj+FXOReDOrN7PG9H3gauAFUu1d7222HrjXnxoWRba2bgQ+5M0AuRQYTg8VlINTxrJ/l9TnDql232hmYTNbAawEnix2/fLBzAy4C9jhnPvypKfK/jPP1va8fu5+H9Uu0JHy60kdHX8J+Cu/61PAdp5F6gj/c8C2dFuB+cCDwG7vttXvuuapvd8l9afuBKmezk3Z2krqz+CveL8DzwPdftc/z+3+V69dW73/+Isnbf9XXrt3Atf5Xf9ZtPtyUkMXW4FnvZ/rK+Qzz9b2vH3uWt5BRKQCleOwj4iITEPhLyJSgRT+IiIVSOEvIlKBFP4iIhVI4S8iUoEU/iIiFej/A+pBE8Gt0c2KAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divide_age(age):\n",
    "    \"\"\"\n",
    "    :return:\n",
    "        Nan,0-6,>100  --> 0 年龄填写有误\n",
    "        7 - 12        --> 1 少儿\n",
    "        13 - 17       --> 2 青少年\n",
    "        18 - 45       --> 3 青年\n",
    "        46 - 69       --> 4 中年\n",
    "        70 - 100      --> 5 老年\n",
    "    \"\"\"\n",
    "    if np.isnan(age) or (age <= 6) or (age > 100):\n",
    "        return 0\n",
    "    if age >= 7 and age <= 12:\n",
    "        return 1\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "df_user['age'] = df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析年龄段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 分析打分表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149780 non-null int64\n",
      "item_id    1149780 non-null object\n",
      "rating     1149772 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 删除有误数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149772 non-null int64\n",
      "item_id    1149772 non-null object\n",
      "rating     1149772 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating = df_rating.dropna()\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用户活跃度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_value_counts = df_rating['user_id'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(user_value_counts)),\n",
    "    user_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 商品流行度分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAD4CAYAAAAZ1BptAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAU/0lEQVR4nO3db4xdd33n8ffXM7ZJ4jRxsJP12qZOqKuSrrYmnSZBVBUVJf+eBCSQkgfETZFctYkEUiut00qbbKtI7GqBVXZpihEmYZeSpgKEVZkaN1ChPiDxJDWJjTEZkhRP7MYTHBzIP8fj7z64v4Hr8T3z75y5M3P6fklX99zv+Z17vuf42h/fc86cicxEkqReli10A5KkxcuQkCRVMiQkSZUMCUlSJUNCklRpcKEbmMqaNWty06ZNC92GJC0pjz/++IuZubaJ91rUIbFp0yaGh4cXug1JWlIi4l+bei8PN0mSKhkSkqRKhoQkqZIhIUmqZEhIkipNGxIRsTEivhURhyLiYER8tNTviYjnI2J/edzUtcxdETESEYcj4vqu+g2lNhIR2+dnkyRJTZnJJbCngT/JzCci4kLg8YjYW+Z9KjP/Z/fgiLgSuAX4deA/Av8YEb9aZn8aeB8wCuyLiF2Z+b0mNkSS1Lxpv0lk5rHMfKJM/xQ4BKyfYpGbgYcy843MfBYYAa4uj5HMfCYzTwEPlbGNe/XUaT75jcP8y49emo+3l6R/N2Z1TiIiNgHvBB4tpTsj4smI2BkRq0ttPXCka7HRUquqT17HtogYjojhsbGx2bT3c6+dGue+b47w1PMn57S8JKljxiEREauALwMfy8yXgfuBtwNbgGPAJyaG9lg8p6ifXcjckZlDmTm0dm0jP1UuSZqjGd2WIyKW0wmIL2bmVwAy84Wu+Z8F/r68HAU2di2+AThapqvqkqRFaCZXNwXwOeBQZn6yq76ua9gHgANlehdwS0SsjIjLgc3AY8A+YHNEXB4RK+ic3N7VzGZIkubDTL5JvBv4MPBUROwvtT8Dbo2ILXQOGT0H/CFAZh6MiIeB79G5MuqOzBwHiIg7gT3AALAzMw82uC2SpIZNGxKZ+c/0Pp+we4pl7gXu7VHfPdVyTctzznhIkmajlT9x3TlCJkmqq5UhIUlqhiEhSapkSEiSKhkSkqRKrQ6J9PImSaqllSHhtU2S1IxWhoQkqRmGhCSpkiEhSapkSEiSKhkSkqRKrQ4JL4CVpHpaGRLe30+SmtHKkJAkNcOQkCRVMiQkSZUMCUlSpVaHhPf3k6R6WhkS4S3+JKkRrQwJSVIzDAlJUiVDQpJUyZCQJFVqdUh4cZMk1dPOkPDiJklqRDtDQpLUCENCklTJkJAkVTIkJEmVWh0S6c2bJKmWaUMiIjZGxLci4lBEHIyIj5b6JRGxNyKeLs+rSz0i4r6IGImIJyPiqq732lrGPx0RW+dro/zNdJLUjJl8kzgN/ElmvgO4FrgjIq4EtgOPZOZm4JHyGuBGYHN5bAPuh06oAHcD1wBXA3dPBIskaXGaNiQy81hmPlGmfwocAtYDNwMPlmEPAu8v0zcDX8iO7wAXR8Q64Hpgb2aeyMyXgL3ADY1ujSSpUbM6JxERm4B3Ao8Cl2XmMegECXBpGbYeONK12GipVdUnr2NbRAxHxPDY2Nhs2pMkNWzGIRERq4AvAx/LzJenGtqjllPUzy5k7sjMocwcWrt27UzbkyTNgxmFREQspxMQX8zMr5TyC+UwEuX5eKmPAhu7Ft8AHJ2iLklapGZydVMAnwMOZeYnu2btAiauUNoKfK2rflu5yula4GQ5HLUHuC4iVpcT1teVWuO8uEmSmjE4gzHvBj4MPBUR+0vtz4CPAw9HxEeAHwEfKvN2AzcBI8CrwO0AmXkiIv4S2FfG/UVmnmhkKyRJ82LakMjMf6b6P+fv7TE+gTsq3msnsHM2DUqSFk6rf+JaklSPISFJqtTqkPDWTZJUTytDIrx5kyQ1opUhIUlqhiEhSapkSEiSKhkSkqRKhoQkqVKrQyLPvcmsJGkWWhkSXgArSc1oZUhIkpphSEiSKhkSkqRKhoQkqVKrQ8Ib/ElSPa0MCe/vJ0nNaGVISJKaYUhIkioZEpKkSoaEJKlSq0PCi5skqZ5WhkR49yZJakQrQ0KS1AxDQpJUyZCQJFUyJCRJlVodEt67SZLqaWVIeO8mSWpGK0NCktSMaUMiInZGxPGIONBVuycino+I/eVxU9e8uyJiJCIOR8T1XfUbSm0kIrY3vymSpKbN5JvEA8ANPeqfyswt5bEbICKuBG4Bfr0s81cRMRARA8CngRuBK4Fby1hJ0iI2ON2AzPx2RGya4fvdDDyUmW8Az0bECHB1mTeSmc8ARMRDZez3Zt2xJKlv6pyTuDMiniyHo1aX2nrgSNeY0VKrqp8jIrZFxHBEDI+NjdVoD9K7N0lSLXMNifuBtwNbgGPAJ0q913VFOUX93GLmjswcysyhtWvXzrE9SVITpj3c1EtmvjAxHRGfBf6+vBwFNnYN3QAcLdNVdUnSIjWnbxIRsa7r5QeAiSufdgG3RMTKiLgc2Aw8BuwDNkfE5RGxgs7J7V1zb1uS1A/TfpOIiC8B7wHWRMQocDfwnojYQueQ0XPAHwJk5sGIeJjOCenTwB2ZOV7e505gDzAA7MzMg41vjSSpUTO5uunWHuXPTTH+XuDeHvXdwO5ZdSdJWlCt/olr790kSfW0MiS8d5MkNaOVISFJaoYhIUmqZEhIkioZEpKkSoaEJKmSISFJqtTKkIie9xOUJM1WK0NCktQMQ0KSVMmQkCRVMiQkSZVaHRLpHf4kqZZWhoQ3+JOkZrQyJCRJzTAkJEmVDAlJUiVDQpJUqdUh4cVNklRPK0PCi5skqRmtDAlJUjMMCUlSJUNCklTJkJAkVWp1SHhxkyTV08qQCG/eJEmNaGVISJKaYUhIkioZEpKkSoaEJKnStCERETsj4nhEHOiqXRIReyPi6fK8utQjIu6LiJGIeDIirupaZmsZ/3REbJ2fzTmb926SpHpm8k3iAeCGSbXtwCOZuRl4pLwGuBHYXB7bgPuhEyrA3cA1wNXA3RPBMh+8tkmSmjFtSGTmt4ETk8o3Aw+W6QeB93fVv5Ad3wEujoh1wPXA3sw8kZkvAXs5N3gkSYvMXM9JXJaZxwDK86Wlvh440jVutNSq6ueIiG0RMRwRw2NjY3NsT5LUhKZPXPc60pNT1M8tZu7IzKHMHFq7dm2jzUmSZmeuIfFCOYxEeT5e6qPAxq5xG4CjU9QlSYvYXENiFzBxhdJW4Gtd9dvKVU7XAifL4ag9wHURsbqcsL6u1OZVevcmSaplcLoBEfEl4D3AmogYpXOV0seBhyPiI8CPgA+V4buBm4AR4FXgdoDMPBERfwnsK+P+IjMnnwxvjLdukqRmTBsSmXlrxaz39hibwB0V77MT2Dmr7iRJC8qfuJYkVTIkJEmVDAlJUiVDQpJUqdUh4Q3+JKmeVoaEv75UkprRypCQJDXDkJAkVTIkJEmVDAlJUqVWh4QXN0lSPa0OCUlSPYaEJKmSISFJqmRISJIqGRKSpErtDglv3iRJtbQ2JLx9kyTV19qQkCTVZ0hIkioZEpKkSoaEJKlSq0PCa5skqZ7WhoQXN0lSfa0NCUlSfYaEJKmSISFJqmRISJIqtTokvHWTJNXT2pAIb94kSbXVComIeC4inoqI/RExXGqXRMTeiHi6PK8u9YiI+yJiJCKejIirmtgASdL8aeKbxO9m5pbMHCqvtwOPZOZm4JHyGuBGYHN5bAPub2DdkqR5NB+Hm24GHizTDwLv76p/ITu+A1wcEevmYf2SpIbUDYkEvhERj0fEtlK7LDOPAZTnS0t9PXCka9nRUjtLRGyLiOGIGB4bG6vZniSpjsGay787M49GxKXA3oj4/hRje51JPuf6o8zcAewAGBoa8vokSVpAtb5JZObR8nwc+CpwNfDCxGGk8ny8DB8FNnYtvgE4Wmf90/bnLf4kqZY5h0REXBARF05MA9cBB4BdwNYybCvwtTK9C7itXOV0LXBy4rDUfPACWEmqr87hpsuAr5afRxgE/iYz/yEi9gEPR8RHgB8BHyrjdwM3ASPAq8DtNdYtSeqDOYdEZj4D/EaP+o+B9/aoJ3DHXNcnSeq/1v7EtSSpPkNCklSp1SHhDf4kqZ7WhoT395Ok+lobEpKk+gwJSVIlQ0KSVMmQkCRVanVIeHGTJNXT2pAI794kSbW1NiQkSfUZEpKkSoaEJKmSISFJqtTekAg4482bJKmW1obE8mXB+LghIUl1tDckBpfx5viZhW5Dkpa09obEwDJOGRKSVEtrQ2LFwDJOnfZwkyTV0dqQWD4QHm6SpJpaGxIrBpdx6rQhIUl1tDYkzlsxyCunTi90G5K0pLU2JFatHOCVNwwJSaqjxSExyE9fNyQkqY7WhsQlF6zgJ6+9udBtSNKS1tqQWLNqJT/+2Ruc9gonSZqz1obExtXncybhyEuvLXQrkrRktTYk3rHulwB46vmTC9yJJC1dLQ6JC7novOXsOfhvC92KJC1ZrQ2JwYFlfOg3N/D1p45xwG8TkjQnrQ0JgD/+3V9hzaqV/P7nH+OfDh8n/f0SkjQrfQ+JiLghIg5HxEhEbJ/PdV1ywQo+f/tvsXxgGb//+X1c/7++zce//n32HPw3nn3xFW/bIUnTiH7+7zoiBoAfAO8DRoF9wK2Z+b1e44eGhnJ4eLj2el9/c5y/Gz7Cl594nu+O/oSJTY7oXCr71gtWcPH5y7lgxSBrVq1kxeAylg8s4+Lzl3P+igEGlsXPHxesGGTVykGWLYOIYFkEywIGIsprGBwILjpvBQPLgijrCYKI7n3RWX7y/ACY9DoiOG/5AOetGKi9LyS1X0Q8nplDTbzXYBNvMgtXAyOZ+QxARDwE3Az0DImmvGX5AB9+1yY+/K5N/OyN0xx8/iQ/HHuFIy+9yomfneLYy6/z2qnTPPvjVzhw9CRvjievvznOq6fG57OtWesOGSiBctb8mGLe5GWnfrOplp+87Gz66jWfqJ53zrKzWNdF5y1ncNk5a5OWhF9b90v871vfudBt9D0k1gNHul6PAtd0D4iIbcA2gLe97W2NN7Bq5SDXXPFWrrnirdOOfe3UOKfPnGH8THL6THJ6PDnxyinGzyRncuLR+V3aZ850pjOTV06N88obp0mSTDqP8p6Z2ZlOfjGfiTG/eE0Zl+U9T752mvEzvzg8Nvn7X/cXwpw0d/KXxamW7bU82XPy59sz13VN1+dk56xrivd+c/wML7/uT9xr6dq4+ryFbgHof0j0+m/dWX/XM3MHsAM6h5v60VSVzuGdsw/x/IeL3rIwzUjSAuj3ietRYGPX6w3A0T73IEmaoX6HxD5gc0RcHhErgFuAXX3uQZI0Q3093JSZpyPiTmAPneM4OzPzYD97kCTNXL/PSZCZu4Hd/V6vJGn2Wv0T15KkegwJSVIlQ0KSVMmQkCRV6uu9m2YrIsaAf63xFmuAFxtqpx+WWr9gz/2w1PoFe+6Hqfr95cxc28RKFnVI1BURw03d5Kofllq/YM/9sNT6BXvuh3716+EmSVIlQ0KSVKntIbFjoRuYpaXWL9hzPyy1fsGe+6Ev/bb6nIQkqZ62f5OQJNVgSEiSKrUyJCLihog4HBEjEbF9Adb/XEQ8FRH7I2K41C6JiL0R8XR5Xl3qERH3lV6fjIirut5naxn/dERs7ar/Znn/kbLsrH9HZ0TsjIjjEXGgqzbvPVato0bP90TE82Vf74+Im7rm3VXWfzgiru+q9/x8lFvYP1p6+9tyO3siYmV5PVLmb5phvxsj4lsRcSgiDkbERxf7fp6i58W8n98SEY9FxHdLz/9trutpalvm2O8DEfFs1z7eUuoL+7nIzFY96NyC/IfAFcAK4LvAlX3u4TlgzaTa/wC2l+ntwH8v0zcBX6fzW/uuBR4t9UuAZ8rz6jK9usx7DHhXWebrwI1z6PF3gKuAA/3ssWodNXq+B/jTHmOvLH/2K4HLy2di4lcN9vx8AA8Dt5Tpvwb+qEz/MfDXZfoW4G9n2O864KoyfSHwg9LXot3PU/S8mPdzAKvK9HLg0bL/ZrWeJrdljv0+AHywx/gF/Vws6D/o8/EoO2ZP1+u7gLv63MNznBsSh4F1ZXodcLhMfwa4dfI44FbgM131z5TaOuD7XfWzxs2yz02c/Q/uvPdYtY4aPd9D73+8zvpzp/M7TN5V9fkof5leBAYnf44mli3Tg2VczGF/fw1431LYzz16XhL7GTgfeAK4ZrbraXJb5tjvA/QOiQX9XLTxcNN64EjX69FS66cEvhERj0fEtlK7LDOPAZTnS0u9qt+p6qM96k3oR49V66jjzvI1fGfX1+fZ9vxW4CeZebpHzz9fpsw/WcbPWDmk8U46/2tcEvt5Us+wiPdzRAxExH7gOLCXzv/8Z7ueJrdlVv1m5sQ+vrfs409FxMrJ/c6wr0Y/F20MiV7H5/t9ne+7M/Mq4Ebgjoj4nSnGVvU72/p8Wsw93g+8HdgCHAM+UepN9lxreyJiFfBl4GOZ+fJUQ2fZ27zt5x49L+r9nJnjmbkF2ABcDbxjDuvp2/6f3G9E/Cc6305+DfgtOoeQ/kvD/c5JG0NiFNjY9XoDcLSfDWTm0fJ8HPgqnQ/tCxGxDqA8Hy/Dq/qdqr6hR70J/eixah1zkpkvlL9wZ4DP0tnXc+n5ReDiiBicVD/rvcr8i4ATM+kvIpbT+cf2i5n5lVJe1Pu5V8+LfT9PyMyfAP9E59j9bNfT5LbMtt8bMvNYdrwBfJ657+NGPxdtDIl9wOZy1cEKOiemdvVr5RFxQURcODENXAccKD1sLcO20jnWS6nfVq5guBY4Wb4G7gGui4jV5av9dXSOdx4DfhoR15YrFm7req+6+tFj1TrmZOIDX3yAzr6eWM8t5UqWy4HNdE7m9fx8ZOcg7beAD1Zs/0TPHwS+WcZP11sAnwMOZeYnu2Yt2v1c1fMi389rI+LiMn0e8HvAoTmsp8ltmW2/3+/6xzuA93P2Pl64z8VsTrIslQedqwF+QOe45J/3ed1X0Ln64bvAwYn10zl++QjwdHm+pNQD+HTp9SlgqOu9/gAYKY/bu+pD5QP0Q+D/MLeTqF+ic9jgTTr/8/hIP3qsWkeNnv9v6enJ8hdgXdf4Py/rP0zXFWBVn4/yZ/dY2Za/A1aW+lvK65Ey/4oZ9vvbdL7mPwnsL4+bFvN+nqLnxbyf/zPwL6W3A8B/net6mtqWOfb7zbKPDwD/j19cAbWgnwtvyyFJqtTGw02SpIYYEpKkSoaEJKmSISFJqmRISJIqGRKSpEqGhCSp0v8Hl4/7GdHZ2nYAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "plt.plot(\n",
    "    range(len(item_value_counts)),\n",
    "    item_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149772 non-null int64\n",
      "item_id    1149772 non-null object\n",
      "rating     1149772 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149772 non-null int64\n",
      "item_id    1149772 non-null object\n",
      "rating     1149772 non-null int32\n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating['rating'] = df_rating['rating'].astype(int)\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 合并用户表与打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      "user_id     1149772 non-null int64\n",
      "location    1149772 non-null object\n",
      "age         1149772 non-null int64\n",
      "item_id     1149772 non-null object\n",
      "rating      1149772 non-null int32\n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 48.2+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      "user_id     1149772 non-null int64\n",
      "location    1149772 non-null object\n",
      "age         1149772 non-null int32\n",
      "item_id     1149772 non-null object\n",
      "rating      1149772 non-null int32\n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 43.9+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data['age'] = df_data['age'].astype(int)\n",
    "df_data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 保存表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "object1 = cPickle.load(\n",
    "    open('./data/df_data.pkl','rb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "object1.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
